package com.gpframework.common.core.domain;

import com.gpframework.common.constant.HttpStatus;
import com.gpframework.common.utils.function.SupplierPlus;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * 操作消息提醒
 *
 * @Author gpframework
 */
@Data
@ApiModel
public class AjaxResult<T> {
    private static final long serialVersionUID = 1L;

    private static Logger logger = LoggerFactory.getLogger(AjaxResult.class);

    /**
     * 状态码
     */
    @ApiModelProperty(value = "消息状态码 200为成功", example = "200")
    private int code;

    /**
     * 返回描述内容
     */
    @ApiModelProperty(value = "返回描述内容", example = "操作成功")
    private String msg;

    /**
     * 返回动效SVGA
     */
/*    @ApiModelProperty(value = "返回动效SVGA", example = "")
    private String svga;*/

    /**
     * 数据对象
     */
    @ApiModelProperty("数据对象")
    private T data;

    /**
     * 数据总数
     */
    @ApiModelProperty("数据总数")
    private Integer total;

    /**
     * 初始化一个新创建的 AjaxResult 对象，使其表示一个空消息。
     */
    public AjaxResult() {
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     */
    public AjaxResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     * @param data 数据对象
     */
    public AjaxResult(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
//        this.svga = svga;
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     * @param data 数据对象
     */
    public AjaxResult(int code, String msg, T data, Integer total) {
        this.code = code;
        this.msg = msg;
        this.data = data;
        this.total = total;
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static AjaxResult success() {
        return AjaxResult.success("operation successful");
    }


    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static AjaxResult success(Object data) {
        return AjaxResult.success("operation successful", data);
    }

    /**
     * 返回成功数据带自定义分页
     *
     * @return 成功消息
     */
    public static AjaxResult successPage(Object data, Integer total) {
        return new AjaxResult(HttpStatus.SUCCESS, "", data, total);
    }

    public static AjaxResult builder(SupplierPlus supplierPlus) {
        AjaxResult result = null;
        try {
            Object data = supplierPlus.get();

            result = AjaxResult.success(data);
            // 设置总数。
            if (data instanceof List) {
                result.setTotal(((List) data).size());
            } else {
                result.setTotal(1);
            }
        } catch (Exception e) {
//            logger.error(e.toString());
            e.printStackTrace();
            result = AjaxResult.error(e.getMessage());
            result.setTotal(0);
        }
        return result;
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @return 成功消息
     */
    public static AjaxResult success(String msg) {
        return AjaxResult.success(msg, null);
    }

    /**
     * 返回成功消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static AjaxResult success(String msg, Object data) {
        return new AjaxResult(HttpStatus.SUCCESS, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @return
     */
    public static AjaxResult error() {
        return AjaxResult.error("operation failed");
    }

    /**
     * 返回用户不存在
     *
     * @return
     */
    public static AjaxResult memberNotExit() {
        return AjaxResult.error("member does not exist");
    }


    /**
     * 返回订单号不存在
     *
     * @return
     */
    public static AjaxResult orderNoNotExist() {
        return AjaxResult.error("orderno not exist");
    }


    /**
     * 返回用户账户不存在
     *
     * @return
     */
    public static AjaxResult memberAccountNotExit() {
        return AjaxResult.error("memberAccount does not exist");
    }


    /**
     * 返回系统错误
     *
     * @return
     */
    public static AjaxResult systemError() {
        return AjaxResult.error("system error");
    }

    /**
     * 返回参数错误信息
     *
     * @return
     */
    public static AjaxResult parameterError() {
        return AjaxResult.error(HttpStatus.BAD_REQUEST, "parameter error");
    }

    /**
     * 返回参数错误信息
     *
     * @return
     */
    public static AjaxResult storeParameterError() {
        return AjaxResult.error(HttpStatus.BAD_REQUEST, "请选择门店");
    }

    /**
     * 返回操作方式错误
     *
     * @return
     */
    public static AjaxResult wrongOperation() {
        return AjaxResult.error("wrong operation mode");
    }


    /**
     * 用户不存在
     */
    public static AjaxResult memberNotFound() {
        return AjaxResult.error("用户不存在");
    }


    /**
     * 越权操作
     */
    public static AjaxResult unauthorized() {
        return AjaxResult.error(HttpStatus.UNAUTHORIZED, "Unauthorized operation. The current user has no right to perform the operation");
    }

    /**
     * 手机号已被注册
     *
     * @return
     */
    public static AjaxResult mobileRegistered() {
        return AjaxResult.error("The mobile phone number has been registered");
    }

    /**
     * 验证码错误
     *
     * @return
     */
    public static AjaxResult codeError() {
        return AjaxResult.error("The verification code error");
    }

    /**
     * 验证码过期
     *
     * @return
     */
    public static AjaxResult codeInvalid() {
        return AjaxResult.error("The verification code is invalid");
    }

    /**
     * 验证码过期或错误
     *
     * @return
     */
    public static AjaxResult codeInvalidOrError() {
        return AjaxResult.error("The verification error or expired");
    }

    /**
     * token过期
     *
     * @return
     */
    public static AjaxResult tokenExpired() {
        return AjaxResult.error(HttpStatus.FORBIDDEN, "invalidation of identity");
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static AjaxResult error(String msg) {
        return AjaxResult.error(msg, null);
    }

    /**
     * 返回错误消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static AjaxResult error(String msg, Object data) {
        return new AjaxResult(HttpStatus.ERROR, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @param code 状态码
     * @param msg  返回内容
     * @return 警告消息
     */
    public static AjaxResult error(int code, String msg) {
        return new AjaxResult(code, msg, null);
    }

    /**
     * 用户不存在
     *
     * @return
     */
    public static AjaxResult notFoundMemberError() {
        return new AjaxResult(HttpStatus.NOT_FOUND, "用户不存在", null);
    }


    /**
     * 未找到数据
     *
     * @return
     */
    public static AjaxResult notFoundDataError() {
        return new AjaxResult(HttpStatus.NOT_FOUND, "未找到数据", null);
    }


    /**
     * 获取微信openid失败
     *
     * @return
     */
    public static AjaxResult getWxOpenIdError() {
        return new AjaxResult(HttpStatus.NO_SATISFY, "获取openId失败", null);
    }
}
